/*
take 就像我们更早之前看到的 call 和 put。它创建另一个命令对象，告诉 middleware 等待一个特定的 action

takeEvery 是靠take实现的
takeEvery 是一个死循环,会一直监听
而take只会监听一次,触发一次就销毁
*/
import * as types from './action-types'
import {delay,takeEvery,put,take,all,select} from 'redux-saga/effects'

//saga就是一个generator函数
export function* watchAsyncIncrement(): any {
  for (let i=0;i<3;++i){ //没错 generator在for里也能暂停
    const action = yield take(types.ASYNC_INCREMENT);
    console.log(action);
    yield put({type: types.INCREMENT})
  }
  alert('已经达到最大值3')
}

export function* watchAndLog(): any{
  //我要在这里记录每一次派发的动作,当动作派发之后打印日志
  while(true){
    // * 通配符 可以匹配任何动作 take的返回值就是监听到的actions里的action函数的返回值
    const action = yield take('*')
    console.log(action)

    //select如果不传参,返回的就是当前仓库中的状态
    //如果传一个函数,就代表先从仓库中获取总的状态,然后得到返回值
    // let state = yield select()
    const state = yield select(state=>state.number)
    console.log('state', state)
  }
}

export default function* rootSaga(): any{
  yield all([watchAsyncIncrement(),watchAndLog()])
}
